// var i;
// exports.UIViewShowType = void 0;
// var c;
// var $eventManager = require("./EventManager");
// var $logManager = require("./LogManager");
// var $resKeeper = require("./ResKeeper");
// var $uIManager = require("./UIManager");
// var $uITools = require("./UITools");
// var h = cc._decorator;
// var f = h.ccclass;
// var g = h.property;
// var _ = h.menu;
// !(function (e) {
//     e[(e.Normal = 0)] = "Normal";
//     e[(e.Sclae = 1)] = "Sclae";
//     e[(e.Opacity = 2)] = "Opacity";
// })((c = exports.UIViewShowType || (exports.UIViewShowType = {})));
// var y = (function (e) {
//     function t() {
//         var t = (null !== e && e.apply(this, arguments)) || this;
//         t._scene = !1;
//         t.isCache = !1;
//         t.isFull = !1;
//         t.showType = c.Normal;
//         t.auto_ui = null;
//         t._params = null;
//         t._eventMap = new Map();
//         t._hideViews = [];
//         t._actTime = 0.2;
//         return t;
//     }
//     __extends(t, e);
//     Object.defineProperty(t.prototype, "params", {
//         get: function () {
//             return this._params;
//         },
//         enumerable: !1,
//         configurable: !0
//     });
//     Object.defineProperty(t.prototype, "bundleName", {
//         get: function () {
//             return this._bundleName;
//         },
//         enumerable: !1,
//         configurable: !0
//     });
//     Object.defineProperty(t.prototype, "uiName", {
//         get: function () {
//             return this._uiName;
//         },
//         enumerable: !1,
//         configurable: !0
//     });
//     t.prototype.init = function (e, t, o) {
//         this._bundleName = e;
//         this._uiName = t;
//         this._params = o;
//         this._addClickListener();
//         this._addEventListener();
//         this._show.apply(this, o);
//         this._showOpenAnim();
//     };
//     t.prototype._close = function () {
//         $uIManager.default.close(this);
//     };
//     t.prototype.onResume = function (e) {
//         var t = [];
//         for (var o = 1; o < arguments.length; o++) {
//             t[o - 1] = arguments[o];
//         }
//     };
//     t.prototype.onClose = function () {};
//     t.prototype._showOpenAnim = function () {
//         var e = this;
//         var t = this.node;
//         var o = t.getChildByName("root") || t;
//         if (this.showType == c.Sclae) {
//             var n = o.scale;
//             o.scale = 0.1;
//             cc.tween(o)
//                 .to(
//                     this._actTime,
//                     {
//                         scale: n
//                     },
//                     {
//                         easing: ""
//                     }
//                 )
//                 .call(function () {
//                     e._onOpenAnimOver();
//                 })
//                 .start();
//         } else {
//             if (this.showType == c.Opacity) {
//                 o.opacity = 0;
//                 cc.tween(o)
//                     .to(this._actTime, {
//                         opacity: 255
//                     })
//                     .call(function () {
//                         e._onOpenAnimOver();
//                     })
//                     .start();
//             } else {
//                 this._onOpenAnimOver();
//             }
//         }
//     };
//     t.prototype._onOpenAnimOver = function () {
//         if (this.isFull) {
//             this._hideOtherViews();
//         }
//     };
//     t.prototype._clickListener = function () {};
//     t.prototype._addEventListener = function () {};
//     t.prototype._hideOtherViews = function () {
//         var e = $uIManager.default.getAllViews();
//         var t = e.indexOf(this);
//         for (var o = 0; o < e.length; o++) {
//             var n = e[o];
//             var i = n.node;
//             var a = i.zIndex;
//             if (n != this && i.active && t > a) {
//                 e[o].node.active = !1;
//                 this._hideViews.push(e[o]);
//             }
//         }
//     };
//     t.prototype.showHideViews = function () {
//         for (var e = 0; e < this._hideViews.length; e++) {
//             var t = this._hideViews[e];
//             if (t && t.node) {
//                 t.node.active = !0;
//             }
//         }
//     };
//     t.prototype._addClickListener = function () {
//         var e;
//         if (!(null === (e = this.auto_ui) || void 0 === e)) {
//             e.addClickListener(this._clickListener, this);
//         }
//         var t = this._bundleName + "_" + this._uiName + "_block";
//         var o = this.node.getChildByName(t);
//         if (o) {
//             var n = o.addComponent(cc.Button);
//             $uITools.default.addClickEvent(n, this._clickBlock, this);
//         }
//     };
//     t.prototype._addEvent = function (e, t, o) {
//         if (!(null != o)) {
//             o = this;
//         }
//         var n = this._eventMap.get(e);
//         if (n && o == n.target && t == n.callBack) {
//             $logManager.LogMgr.error("重复注册事件:" + e);
//         } else {
//             $eventManager.EventMgr.addEventListener(e, t, o);
//             this._eventMap.set(e, {
//                 callBack: t,
//                 target: o
//             });
//         }
//     };
//     t.prototype.rmEvents = function () {
//         this._eventMap.forEach(function (e, t) {
//             var o = e.callBack;
//             var n = e.target;
//             $eventManager.EventMgr.rmEventListener(t, o, n);
//         });
//         this._eventMap.clear();
//     };
//     t.prototype._clickBlock = function () {};
//     __decorate(
//         [
//             g({
//                 displayName: "是否常驻",
//                 visible: function () {
//                     return !this._scene;
//                 }
//             })
//         ],
//         t.prototype,
//         "isCache",
//         void 0
//     );
//     __decorate(
//         [
//             g({
//                 displayName: "是否全屏",
//                 visible: function () {
//                     return !this._scene;
//                 }
//             })
//         ],
//         t.prototype,
//         "isFull",
//         void 0
//     );
//     __decorate(
//         [
//             g({
//                 type: cc.Enum(c),
//                 displayName: "打开方式",
//                 visible: function () {
//                     return !this._scene;
//                 }
//             })
//         ],
//         t.prototype,
//         "showType",
//         void 0
//     );
//     return __decorate([f, _("view/UIView")], t);
// })($resKeeper.default);
// exports.default = y;

// import { EventMgrInstance } from "./EventManager";
// import { LogMgr } from "./LogManager";
// import ResKeeper from "./ResKeeper";
// import UIManager from "./UIManager";
// import CommonUtils from "./UITools";


// const { ccclass: ccclass, property: property, menu: menu } = cc._decorator;

// /**
//  * UIViewShowType 枚举，建议名称：ViewShowType
//  */
// export enum UIViewShowType {
//     Normal = 0,
//     Sclae = 1,
//     Opacity = 2
// }

// /**
//  * UIView 类，建议名称：UIViewComponent
//  */
// @ccclass
// @menu("view/UIView")
// export default class UIView extends ResKeeper {
//     @property({
//         displayName: "是否常驻",
//         visible() {
//             return !this._scene;
//         }
//     })
//     isCache: boolean = false;

//     @property({
//         displayName: "是否全屏",
//         visible() {
//             return !this._scene;
//         }
//     })
//     isFull: boolean = false;

//     @property({
//         type: cc.Enum(UIViewShowType),
//         displayName: "打开方式",
//         visible() {
//             return !this._scene;
//         }
//     })
//     showType: UIViewShowType = UIViewShowType.Normal;

//     protected _scene: boolean = false;
//     private _params: any = null;
//     private _eventMap: Map<string, { callBack: Function, target: any }> = new Map();
//     protected _hideViews: any[] = [];
//     private _actTime: number = 0.2;
//     private _bundleName: string;
//     private _uiName: string;
//     protected auto_ui: any = null;

//     /**
//      * 获取参数
//      * @returns 参数
//      * 建议方法名：getParams
//      */
//     get params(): any {
//         return this._params;
//     }

//     /**
//      * 获取包名
//      * @returns 包名
//      * 建议方法名：getBundleName
//      */
//     get bundleName(): string {
//         return this._bundleName;
//     }

//     /**
//      * 获取UI名称
//      * @returns UI名称
//      * 建议方法名：getUIName
//      */
//     get uiName(): string {
//         return this._uiName;
//     }

//     /**
//      * 初始化UIView
//      * @param bundleName 包名
//      * @param uiName UI名称
//      * @param params 参数
//      * 建议方法名：initialize
//      */
//     init(bundleName: string, uiName: string, params?: any): void {
//         this._bundleName = bundleName;
//         this._uiName = uiName;
//         this._params = params;
//         this._addClickListener();
//         this._addEventListener();
//         this._show(params); //这里的_show不知道哪来的
//         this._showOpenAnim();
//     }


//     /**
//      * 显示UIView
//      * @param params 参数
//      * 建议方法名：showView
//      */
//     protected _show(params: any) {
//         // 这里可以添加显示UIView的逻辑
//     }
//     /**
//      * 关闭UIView
//      * 建议方法名：closeView
//      */
//     protected _close(): void {
//         UIManager.close(this);
//     }

//     /**
//      * 恢复UIView
//      * @param e 事件
//      * 建议方法名：onResumeView
//      */
//     onResume(e: any, ...args: any): void { }

//     /**
//      * 关闭UIView
//      * 建议方法名：onCloseView
//      */
//     onClose(): void { }

//     /**
//      * 显示打开动画
//      * 建议方法名：showOpenAnimation
//      */
//     protected _showOpenAnim(): void {
//         const node = this.node;
//         const root = node.getChildByName("root") || node;
//         if (this.showType === UIViewShowType.Sclae) {
//             const originalScale = root.scale;
//             root.scale = 0.1;
//             cc.tween(root)
//                 .to(this._actTime, { scale: originalScale }, { easing: "" })
//                 .call(() => {
//                     this._onOpenAnimOver();
//                 })
//                 .start();
//         } else if (this.showType === UIViewShowType.Opacity) {
//             root.opacity = 0;
//             cc.tween(root)
//                 .to(this._actTime, { opacity: 255 })
//                 .call(() => {
//                     this._onOpenAnimOver();
//                 })
//                 .start();
//         } else {
//             this._onOpenAnimOver();
//         }
//     }

//     /**
//      * 打开动画结束
//      * 建议方法名：onOpenAnimationOver
//      */
//     protected _onOpenAnimOver(): void {
//         if (this.isFull) {
//             this._hideOtherViews();
//         }
//     }

//     /**
//      * 点击监听器
//      * 建议方法名：clickListener
//      */
//     protected _clickListener(e: cc.Button): void { }

//     /**
//      * 添加事件监听器
//      * 建议方法名：addEventListener
//      */
//     protected _addEventListener(): void { }

//     /**
//      * 隐藏其他视图
//      * 建议方法名：hideOtherViews
//      */
//     protected _hideOtherViews(): void {
//         const views = UIManager.getAllViews();
//         const currentIndex = views.indexOf(this);
//         for (let i = 0; i < views.length; i++) {
//             const view = views[i];
//             const node = view.node;
//             const zIndex = node.zIndex;
//             if (view !== this && node.active && currentIndex > zIndex) {
//                 view.node.active = false;
//                 this._hideViews.push(view);
//             }
//         }
//     }

//     /**
//      * 显示隐藏的视图
//      * 建议方法名：showHiddenViews
//      */
//     showHideViews(): void {
//         if (this._hideViews && this._hideViews.length > 0) {
//             for (let i = 0; i < this._hideViews.length; i++) {
//                 const view = this._hideViews[i];
//                 if (view && view.node) {
//                     view.node.active = true;
//                 }
//             }            
//         }
//     }

//     /**
//      * 添加点击监听器
//      * 建议方法名：addClickListener
//      */
//     protected _addClickListener(): void {
//         if (this.auto_ui) {
//             this.auto_ui.addClickListener(this._clickListener, this);
//         }
//         const blockName = `${this._bundleName}_${this._uiName}_block`;
//         const blockNode = this.node.getChildByName(blockName);
//         if (blockNode) {
//             const button = blockNode.addComponent(cc.Button);
//             CommonUtils.addClickEvent(button, this._clickBlock, this);
//         }
//     }

//     /**
//      * 添加事件
//      * @param eventName 事件名
//      * @param callBack 回调函数
//      * @param target 目标
//      * 建议方法名：addEvent
//      */
//     protected _addEvent(eventName: string, callBack: Function, target?: any): void {
//         if (!target) {
//             target = this;
//         }
//         const existingEvent = this._eventMap.get(eventName);
//         if (existingEvent && target === existingEvent.target && callBack === existingEvent.callBack) {
//             LogMgr.error(`重复注册事件: ${eventName}`);
//         } else {
//             EventMgrInstance.addEventListener(eventName, callBack, target);
//             this._eventMap.set(eventName, { callBack, target });
//         }
//     }

//     /**
//      * 移除所有事件
//      * 建议方法名：removeAllEvents
//      */
//     rmEvents(): void {
//         if (this._eventMap) {
//             this._eventMap.forEach((value, key) => {
//                 const { callBack, target } = value;
//                 EventMgrInstance.rmEventListener(key, callBack, target);
//             });
//             this._eventMap.clear();
            
//         }
//     }

//     /**
//      * 点击阻止
//      * 建议方法名：clickBlock
//      */
//     protected _clickBlock(): void { }
// }

import { EventMgrInstance } from "./EventManager";
import { LogMgr } from "./LogManager";
import ResKeeper from "./ResKeeper";
import UIManager from "./UIManager";
import CommonUtils from "./UITools";

const { ccclass: ccclass, property: property, menu: menu } = cc._decorator;

/**
 * UIViewShowType 枚举，建议名称：ViewShowType
 */
export enum UIViewShowType {
    Normal = 0,
    Sclae = 1,
    Opacity = 2
}

/**
 * UIView 类，建议名称：UIViewComponent
 */
@ccclass
@menu("view/UIView")
export default class UIViewBase extends ResKeeper {
    @property({
        displayName: "是否常驻",
        visible() {
            return !this._scene;
        }
    })
    isCache: boolean = false;

    @property({
        displayName: "是否全屏",
        visible() {
            return !this._scene;
        }
    })
    isFull: boolean = false;

    @property({
        type: cc.Enum(UIViewShowType),
        displayName: "打开方式",
        visible() {
            return !this._scene;
        }
    })
    showType: UIViewShowType = UIViewShowType.Normal;

    protected _scene: boolean = false;
    private _params: any = null;
    private _eventMap: Map<string, { callBack: Function, target: any }> = new Map();
    protected _hideViews: any[] = [];
    private _actTime: number = 0.2;
    private _bundleName: string;
    private _uiName: string;
    protected auto_ui: any = null;

    /**
     * 获取参数
     * @returns 参数
     * 建议方法名：getParams
     */
    get params(): any {
        return this._params;
    }

    /**
     * 获取包名
     * @returns 包名
     * 建议方法名：getBundleName
     */
    get bundleName(): string {
        return this._bundleName;
    }

    /**
     * 获取UI名称
     * @returns UI名称
     * 建议方法名：getUIName
     */
    get uiName(): string {
        return this._uiName;
    }

    /**
     * 初始化UIView
     * @param bundleName 包名
     * @param uiName UI名称
     * @param params 参数
     * 建议方法名：initialize
     */
    init(bundleName: string, uiName: string, params?: any): void {
        this._bundleName = bundleName;
        this._uiName = uiName;
        this._params = params;
        this._addClickListener();
        this._addEventListener();
        this._show(params);
        this._showOpenAnim();
    }

    /**
     * 显示UIView
     * @param params 参数
     * 建议方法名：showView
     */
    protected _show(params: any) {
        // 这里可以添加显示UIView的逻辑
    }

    /**
     * 关闭UIView
     * 建议方法名：closeView
     */
    protected _close(): void {
        UIManager.close(this);
    }

    /**
     * 恢复UIView
     * @param event 事件
     * 建议方法名：onResumeView
     */
    onResume(event: any, ...args: any): void { }

    /**
     * 关闭UIView
     * 建议方法名：onCloseView
     */
    onClose(): void { }

    /**
     * 显示打开动画
     * 建议方法名：showOpenAnimation
     */
    protected _showOpenAnim(): void {
        const node = this.node;
        const root = node.getChildByName("root") || node;

        if (this.showType === UIViewShowType.Sclae) {
            const originalScale = root.scale;
            root.scale = 0.1;
            cc.tween(root)
                .to(this._actTime, { scale: originalScale }, { easing: "" })
                .call(() => {
                    this._onOpenAnimOver();
                })
                .start();
        } else if (this.showType === UIViewShowType.Opacity) {
            root.opacity = 0;
            cc.tween(root)
                .to(this._actTime, { opacity: 255 })
                .call(() => {
                    this._onOpenAnimOver();
                })
                .start();
        } else {
            this._onOpenAnimOver();
        }
    }

    /**
     * 打开动画结束
     * 建议方法名：onOpenAnimationOver
     */
    protected _onOpenAnimOver(): void {
        if (this.isFull) {
            this._hideOtherViews();
        }
    }

    /**
     * 点击监听器
     * 建议方法名：clickListener
     */
    protected _clickListener(event: cc.Button): void { }

    /**
     * 添加事件监听器
     * 建议方法名：addEventListener
     */
    protected _addEventListener(): void { }

    /**
     * 隐藏其他视图
     * 建议方法名：hideOtherViews
     */
    protected _hideOtherViews(): void {
        const views = UIManager.getAllViews();
        const currentIndex = views.indexOf(this);

        for (let i = 0; i < views.length; i++) {
            const view = views[i];
            const node = view.node;
            const zIndex = node.zIndex;

            if (view !== this && node.active && currentIndex > zIndex) {
                view.node.active = false;
                this._hideViews.push(view);
            }
        }
    }

    /**
     * 显示隐藏的视图
     * 建议方法名：showHiddenViews
     */
    showHideViews(): void {
        if (this._hideViews && this._hideViews.length > 0) {
            for (let i = 0; i < this._hideViews.length; i++) {
                const view = this._hideViews[i];

                if (view && view.node) {
                    view.node.active = true;
                }
            }
        }
    }

    /**
     * 添加点击监听器
     * 建议方法名：addClickListener
     */
    protected _addClickListener(): void {
        if (this.auto_ui) {
            this.auto_ui.addClickListener(this._clickListener, this);
        }

        const blockName = `${this._bundleName}_${this._uiName}_block`;
        const blockNode = this.node.getChildByName(blockName);

        if (blockNode) {
            const button = blockNode.addComponent(cc.Button);
            CommonUtils.addClickEvent(button, this._clickBlock, this);
        }
    }

    /**
     * 添加事件
     * @param eventName 事件名
     * @param callBack 回调函数
     * @param target 目标
     * 建议方法名：addEvent
     */
    protected _addEvent(eventName: string, callBack: Function, target?: any): void {
        if (!target) {
            target = this;
        }

        const existingEvent = this._eventMap.get(eventName);

        if (existingEvent && target === existingEvent.target && callBack === existingEvent.callBack) {
            LogMgr.error(`重复注册事件: ${eventName}`);
        } else {
            EventMgrInstance.addListener(eventName, callBack, target);
            this._eventMap.set(eventName, { callBack, target });
        }
    }

    /**
     * 移除所有事件
     * 建议方法名：removeAllEvents
     */
    rmEvents(): void {
        if (this._eventMap) {
            this._eventMap.forEach((value, key) => {
                const { callBack, target } = value;
                EventMgrInstance.removeListener(key, callBack, target);
            });
            this._eventMap.clear();
        }
    }

    /**
     * 点击阻止
     * 建议方法名：clickBlock
     */
    protected _clickBlock(): void { }
}